#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define N 1010
int u[N], a[N], b[N], n;
vector <int> m[N];
bool dfs(int i)
{
	int j;
	u[i]=1;
	for(j=0; j<m[i].size(); j++)
		if(b[m[i][j]]==-1 || (!u[b[m[i][j]]] && dfs(b[m[i][j]]))) { a[i]=m[i][j]; b[m[i][j]]=i; return 1; }
	return 0;
}
void clr()
{
	int i;
	for(i=0; i<n; u[i]=0, i++);
}
int match()
{
	int i, j, f;
	for(i=0; i<n; a[i]=-1, b[i]=-1, i++);
	for(j=1, f=0; j; f+=j)
		for(clr(), j=0, i=0; i<n; j+=a[i]==-1 && !u[i] && dfs(i), i++);
	return f;
}
int main()
{
	int i, j, k;
	for(scanf("%d%d", &n, &k); k--; scanf("%d%d", &i, &j), i--, j--, m[i].push_back(j));
	for(i=0; i<n; sort(m[i].begin(), m[i].end()), i++);
	printf("%d\n", match());
	u[n]=1;
	for(i=0; i<n; i++)
	{
		clr();
		if(a[i]!=-1)
		{
			b[a[i]]=-1;
			a[i]=-1;
			for(k=n-1; k>=i; k--)
				if(!u[k] && a[k]==-1 && dfs(k)) break;
		}
		clr();
		if(a[i]==-1)
			for(j=0; j<m[i].size(); j++)
				if(!u[b[m[i][j]]]) { a[i]=m[i][j]; break; }
		if(a[i]!=-1)
		{
			if(b[a[i]]!=i) a[b[a[i]]]=-1;
			b[a[i]]=n;
			printf("%d %d\n", i+1, a[i]+1);
		}
	}
	return 0;
}